home *** CD-ROM | disk | FTP | other *** search
/ BMUG Revelations / BMUG Revelations.toast / Programming / Programming Languages / Yerk 3.64 / Module source / Install < prev    next >
Text File  |  1993-07-25  |  17KB  |  532 lines

  1. \ 12/30/81  cbd Version 1
  2. \  2/04/86  cdn Moved in FinalSave ; added "Max Heap" button
  3. \  7/15/86  cdn Exported 
  4. \  7/17/86  cdn Added iBNDL & AddModRes
  5. \  7/28/86  cdn Added saveAppl
  6. \  6/07/91    rfl    modified for system 7 version. Works the same way as old one,
  7. \                but dictionary size refers to amount available above here.
  8. \  6/14/91    rfl    removed maxdict from module since is defined past floating point
  9. \                Instead, use msize !
  10. \                Dictionary size now means size past 'here', the current dictionary size.
  11. \  7/20/91    rfl    remove clobber for my use
  12. \ 10/17/91    rfl    easier to use for install process now. New dialog, better mem management
  13. \ 11/15/91    rfl    added readFP to saveNuc
  14. \  5/17/92    rfl    fixed cancel cosmetic problem
  15. \  5/18/93    rfl    application no longer uses Yerk file as base; it creates
  16. \                  a completely new file, copying resources out of Yerk, leaving Yerk untouched.
  17. \  5/23/93    rfl    added // sarray
  18. \  5/30/93    rfl added various frontend words so module will work with both yerk.com
  19. \                  and yerkFP.com.  Also changed ' (ticks) to 'c >body
  20. \  7/25/93    rfl    removed delete switches and added clobber switch; removed extra ctlwin code
  21.  
  22. Decimal
  23.  
  24. :Module iMod
  25.  
  26.  
  27. Decimal
  28.  
  29. // ctl
  30. // ctlwind
  31. // vscroll
  32. // alert
  33.  
  34. \ This is a copy of the Alert" code from "AlertQ" and "Imports"
  35. \ It is duplicated here so that ALERTMOD is not required on the install disk
  36. \ alert support
  37. \  1/01/85  cbd Version 1
  38. \  9/05/85  cdn Added disp: method
  39. \  8/22/86  cdn Renumbered alert types to correspond with IM
  40.  
  41. 0 Variable tALRT here +base tALRT !
  42.     100 w, 51 w, 191 w, 462 w, 0 w, $ 7fff w,
  43.  
  44. 0 Variable tDITL here +base tDITL !
  45.     2 w,    \ # items-1
  46.     0,  58 w, 177 w,  80 w, 234 w,   4 c, 2 c, 'type ..OK w,
  47.     0,  60 w, 355 w,  81 w, 393 w, 136 c, 4 c, 'type 0000 ,
  48.     0,  10 w,  76 w,  42 w, 393 w, 136 c,
  49.  
  50. 3 Alert Alrt
  51.  
  52. \ Display alert using message saved in-line
  53. : (Al") { RC type -- }
  54.     RC
  55.     IF    \ build ALRT from scratch
  56.             12 newHandle        
  57.             dup 'type ALRT word0 nullOSstr call AddResource
  58.             >ptr tALRT 4+ swap 12 cMove
  59.         \ build DITL from scratch
  60.             R dup c@ align 50 + newHandle
  61.             dup 'type DITL word0 nullOSstr call AddResource
  62.             tDITL 36 + 4 blanks
  63.             RC s->d swap over dabs <# #s sign #> tDITL 36 + swap 4 min cMove
  64.             >ptr tDITL 4+ over 49 cMove
  65.             49 + over c@ 1+ cMove
  66.         arrowcurs
  67.         0 type disp: alrt
  68.         0 GetRes ALRT dup call RmveResource call ReleaseResource
  69.         0 GetRes DITL dup call RmveResource call ReleaseResource
  70.         type 0 max 3 min exec: Aact
  71.     THEN
  72.     R c@ 1+ align R> + >R
  73. ;
  74.  
  75. \ ( RC type : str" -- )  Compile conditional alert box
  76. : Alert"
  77.     ?comp Compile (al") word" c@ 1+ Align allot
  78. ; Immediate
  79.  
  80. : copyRsrc { id type \ hndl -- hndl } id type (getres) -> hndl
  81.         hndl call detachResource
  82.         hndl type id makeint nullOSStr call addResource hndl ;
  83.  
  84. 0 Value curStack
  85. 0 Value curDict
  86.  
  87. 8400 constant minHeap    \ can't set heap to less than this amt
  88. 52 constant stVal        \ 52 from location in nuc
  89.  
  90. \ ( handle -- handle )  mark the resource for update to disk
  91. : ChR dup call ChangedResource ;
  92.  
  93. : unlockSeg 2 getres CODE unlock ;
  94. : lockSeg 2 getres CODE lock ;
  95.  
  96. : readFP " fpInit" sFind
  97.     IF 2drop 5 'type CODE (getres) dup >ptr 'f> rot 0 swap call SizeResource cmove 
  98.     THEN ;
  99.  
  100. 2 constant IsApplication
  101. \ Save the current Yerk Code resource
  102. : saveCode2
  103.     2 GetRes CODE call ChangedResource    \ Mark nucleus for writing
  104.     word0 call ResError i->l 0 Alert" nucleus write error"
  105.     fFcb clrFcb
  106.     tib 410 erase        \ tib, num output, pad, aRegn
  107. \    0 msize !
  108.     cflush call ExitToShell ;    \ Causes nuc changes to be written, but first flush cache
  109.  
  110. \ Save CODE 2 resource without dictionary
  111. : saveNuc 
  112.     'c .s >body nfa dup 8 ! 12 !        \ assumes .s is last definition in nuc
  113.                                 \  store into initLast and initFenc (lastdef)
  114.     16 24 erase                    \ clear user initialization data
  115.                             \ but keep whatever is in msize
  116.     'c (key) 'c abort 20 + !        \ use primitive (key) again
  117.                                 \ assumes abort is original abort (16 offset)
  118.     readFP 
  119.     begin-dp @ 2- (codezone) saveCode2 ;
  120.  
  121. \ Save CODE 2 resource with dictionary; eliminating loaduser code
  122. : saveAppl
  123.     IsApplication 1 getres CODE >ptr 6 + c!        \ flag loader code that this is an appl.
  124.     1 'type CODE copyRsrc dup w 48 call setResAttrs chr call WriteResource
  125.     word0 call ResError i->l 0 Alert" code 1 write error"
  126.     0 'type CODE copyRsrc dup w 32 call setResAttrs chr call WriteResource
  127.     word0 call ResError i->l 0 Alert" code 0 write error"    
  128.     readFP
  129. \      $ 4e714e71 noload ! \ a nono, patch code, but we will flush the cache
  130.     cflush
  131.     0 ' iMod 8+ !        \ protect install code from purge
  132.     purge                \ purge all modules
  133.     0 -> path
  134.     fwind -> actw        \ set active window ptr to fwind, not iwind
  135.     $ 10000 here curDict + - 0 max allot    \ meet 64K boundary requirement
  136.     here  unlockSeg (codezone) lockSeg  
  137.     2 'type CODE copyRsrc w 48 call setResAttrs saveCode2 ;    \ save just enough
  138.  
  139. \ fetch starting stack headroom for this nucleus
  140. : @stack  stVal @ negate ;
  141. : !stack  curStack negate stVal ! ;
  142.  
  143. \ fetch starting heap size for this nucleus
  144. : @heap    s0 @stack -  begin-dp @ - msize @ - ;
  145.  
  146. \ determine amount of heap available for current configuration
  147. : curHeap  @heap @stack curStack - + room curDict - +  ;
  148.  
  149. \ set nucleus minimum heap value - no longer necessary
  150. : !heap  ; \  curHeap  mpatch ! ;
  151.  
  152. Decimal
  153.  
  154. : Closer  close: caller ;
  155.  
  156. Int theItem
  157. Var itemHandle
  158. Int itemType
  159.  
  160. 0 value rtm
  161.  
  162. :CLASS  Dialog  <Super X-Array
  163.  
  164.     Int        Resid
  165.     Var        dialPtr
  166.     Var        procPtr
  167.     Int        boldItem
  168.  
  169.     \ ( -- )
  170.     :M  CLOSE:  get: dialPtr  call DisposDialog   ;M
  171.  
  172.     :M  SET: get: dialPtr call setPort ;M
  173.  
  174.     \ ( item# -- hndl )  get handle for item#
  175.     :M  HANDLE:  { item# -- hndl }  get: dialPtr  item# makeInt
  176.         abs: itemType  abs: itemHandle  abs: tempRect
  177.         call GetDItem get: itemHandle  ;M
  178.  
  179.     \ draws the frame around the hilit item
  180.     :M  FRAME:     get: boldItem -dup
  181.         IF    savePort get: dialPtr call SetPort 3 3 pack call PenSize
  182.             handle: self drop -4 -4 inset: tempRect
  183.             abs: tempRect 16 16 pack call FrameRoundRect call penNormal restPort
  184.         THEN ;M
  185.  
  186.     \ ( -- )  create dialog from resID
  187.     :M  GETNEW:  0 int: resid 0 -1  call GetNewDialog put: dialPtr
  188.         frame: self    ;M
  189.  
  190.     :M  SHOW: get: dialPtr call showWindow frame: self ;M
  191.  
  192.     \ ( cfa -- )  set dialog proc
  193.     :M  SETPROC: >body put: procPtr ;M
  194.  
  195.     \ ( -- )  display as modal dialog
  196.     :M  MODAL:
  197.         BEGIN
  198.             get: procPtr dup IF +base THEN abs: theItem call ModalDialog
  199.             get: theItem ( 1-) exec: super
  200.             rtm
  201.         WHILE
  202.             0 -> rtm    \ iterate every time ReturnToModal is executed
  203.         REPEAT
  204.     ;M
  205.  
  206.     \ ( act0 ... actN -- )  set the dialog's action handlers starting at element 1
  207.     :M  ACTIONS: ?ixobj limit 1- 0
  208.         DO limit i- 1- (^elem) !
  209.         LOOP   ;M
  210.  
  211.     \ ( val item# -- )
  212.     :M  PUT:  handle: self  swap makeInt call SetCtlValue   ;M
  213.  
  214.     \ ( item# -- val ) get value for an item#
  215.     :M  GET:   handle: self  >R word0 R>
  216.         call GetCtlValue word0  ;M    \ added word0 cbd 7/17/85
  217.  
  218.     \ ( resID -- )  Associate object with its resource
  219.     :M  INIT:  put: resID   ;M
  220.  
  221.     \ ( item# -- )  Causes bold outline of the specified item
  222.     :M  HILITE: put: boldItem ;M
  223.  
  224.     \ ( item# -- addr len )  return a text item's text
  225.     :M  GETTEXT: handle: self  buf255 +base   get: ItemType dup 24 and
  226.         IF   drop call GetIText
  227.         ELSE 4 and
  228.              IF   call GetCTitle
  229.              ELSE 2drop 0 buf255 c!        \ user item has no text
  230.             THEN
  231.         THEN
  232.         buf255 count  ;M
  233.  
  234.     \ ( addr len item# -- )  store an item's text
  235.     :M  PUTTEXT: { addr len item# -- } item#  handle: self
  236.         addr len str255   get: ItemType dup 24 and
  237.         IF   drop call SetIText
  238.         ELSE 4 and
  239.              IF   call SetCTitle
  240.              ELSE 2drop                    \ user item has no text
  241.              THEN
  242.         THEN   ;M
  243.  
  244.     \ ( start end item# )  set selection range for text item
  245.     :M  SETSELECT:  { start end item# -- }  get: dialPtr
  246.         item# makeInt start end pack  call SeliText  ;M
  247.  
  248.     \ ( -- )  force drawing of dialog before going to modal:
  249.     :M  DRAW:   get: dialPtr call DrawDialog ;M
  250.  
  251.     \  set user item into dialog; userItem must start with rectangle data
  252.     :M  SETUSERITEM: { userItem -- }
  253.         get: dialPtr getParms: userItem abs: userItem call setDItem ;M
  254.  
  255.     \ ( -- )  Initialize default handlers to close the dialog box
  256.     :M  CLASSINIT:  limit 0 DO 'c closer i to: self LOOP  ;M
  257.  
  258. ;CLASS
  259.  
  260. \ signal modal method to re-enter ModalDialog
  261. : ReturnToModal
  262.     1 -> rtm ;
  263.  
  264. \ Toggle the check box or radio button
  265. : togItem
  266.     get: theItem 1 over get: caller - swap put: caller
  267.     ReturnToModal
  268. ;
  269.  
  270. \ ( addr0 len0 addr1 len1 addr2 len2 addr3 len3 -- )  Substitute Dialog text
  271. : ParamText { \ p1 p2 p3 -- }
  272.      str255 dup -> p3   -base count +
  273.     >str255 dup -> p2   -base count +
  274.     >str255 dup -> p1   -base count +
  275.     >str255     p1 p2 p3 call ParamText
  276. ;
  277.  
  278. 16 dialog iDlg
  279. 111 init: iDlg
  280. 1 hilite: iDlg
  281.  
  282. \ ( addr1 len1 addr2 len2 -- )  Install informatory message
  283. : iMsg    "  " "  " ParamText draw: iDlg ;
  284.  
  285. \ need to load this because sarray is in different
  286. \ locations in yerk.com and yerkFP.com
  287. // pathList
  288. forget getptxt
  289. // listman
  290.  
  291. \ install a resource type module
  292. : AddModRes { mdef arg \ resID -- }
  293.     mdef @ modCode <> IF exit THEN
  294.      mdef indexOf: nMods IF drop ELSE exit THEN
  295.     mdef >name n>count binName name: fFcb
  296.     openReadOnly: fFcb IF exit THEN
  297.     mdef 12 + dispose
  298.     " Module:" getName: fFcb iMsg
  299.     size: fFcb align new: mHndl    \ Create a new handle for this module
  300.     ptr: mHndl size: mHndl  read: fFcb 0 Alert" Module read failed"
  301.     close: fFcb drop
  302.     word0 'type CODE call UniqueID i->l -> resID
  303.     get: mHndl dup 'type CODE resID makeInt        \ Create new Module resource
  304.     mdef >name n>count str255 call AddResource
  305.     dup w 16 call SetResAttrs                    \ mark resource locked
  306.     ChR call WriteResource                        \ write it to application file
  307.     word0 call ResError i->l 0 Alert" Module rsrc write failed.  Check disk space or try Delete modules option."
  308.     resID mdef 22 + w!                            \ store module resID
  309. \    14 get: iDlg IF delete: fFcb drop THEN        \ free up disk space?
  310. ;
  311.  
  312. \ ( item# -- )
  313. : invWord errbeep 0 $ ffff rot setSelect: iDlg ReturnToModal ;
  314.  
  315. \ ( -- True )  validate quit & abort words; if bad return to modal
  316. : okBtn \ { \ qv -- }
  317.     10 getText: iDlg sFind 0= IF 10 invWord exit THEN
  318.     drop cfa -> quitVec
  319.     11 getText: iDlg sFind 0= IF 11 invWord exit THEN
  320.     drop cfa -> abortVec
  321.     12 getText: iDlg sFind 0= IF 12 invWord exit THEN
  322.     drop cfa -> objInit
  323.     True
  324. ;
  325.  
  326. 11 'cfas okBtn False null null null null null null null null null
  327. 4 'cfas null togItem togItem togItem
  328. actions: iDlg
  329.  
  330. Int apRefNum
  331. Var apParam
  332. String applName
  333.  
  334. : getR
  335.     128 GetRes BNDL >ptr @ sp@ 4 3 putText: iDlg
  336.     0 swap (GetRes) >ptr count   4 putText: iDlg
  337.     buf255 +base abs: apRefNum abs: apParam call GetAppParms
  338.     buf255 count 2dup            5 putText: iDlg put: applName
  339.     129 GetRes FREF >ptr @ sp@ 4 6 putText: iDlg drop
  340.     130 GetRes FREF >ptr @ sp@ 4 7 putText: iDlg drop
  341.     131 GetRes FREF >ptr @ sp@ 4 8 putText: iDlg drop
  342.     132 GetRes FREF >ptr @ sp@ 4 9 putText: iDlg drop
  343. ;
  344.  
  345. \ ( addr len -- (addr) )  fetch 1st four bytes on an odd byte, pad with blanks
  346. : drop@ >R sp@ $ 20202020 rot rot R> 4 min cMove ;
  347.  
  348.  
  349. : putR
  350.     128 'type BNDL copyRsrc dup call writeResource put: mHndl
  351.     3 getText: iDlg drop@ dup ptr: mHndl !    ( newSig to BNDL)
  352.     get: mHndl call changedResource
  353.     get: applName name: fFcb 'type APPL over set: fFcb
  354.     4 getText: iDlg dup 1+ align new: mHndl        ( newSig addr len )
  355.       str255 -base ptr: mHndl over c@ 1+ cMove    ( newSig )
  356.       get: mHndl swap word0 nullOSstr call AddResource get: mHndl call writeResource
  357.     10 5 DO i getText: iDlg drop@ 129 getres FREF >ptr !
  358.             123 i+ 'type FREF copyRsrc dup w 32 call setResAttrs
  359.             chr call writeResource
  360.          LOOP
  361.     13 get: iDlg 8 << 256 getres WIND >ptr 10 + w!
  362.      256 'type WIND copyRsrc call writeResource
  363.     133 128 DO i 'type ICN# copyRsrc dup
  364.                w 32 call setResAttrs chr
  365.                call writeResource
  366.             LOOP
  367.     1 'type vers copyRsrc call writeResource
  368.     -1 'type SIZE copyRsrc call writeResource
  369. ;
  370.  
  371. \ set dictionary heap and stack to selected values
  372. \ for apps, the old dictionary had become the new nucleus
  373. : setMem here curDict + ( begin-dp @ -) msize ! ( !heap) !stack
  374.     here 4+ msize 12 - ! \ store new initdp, leave 4 bytes room at end
  375.     latest 8 ! ;        \ store last definition
  376.     
  377.  
  378. \ clobber name fields in nucleus - can't clobber in entire dictionary
  379. \  without leaving :proc definitions intact because of the way initProcs
  380. \  searches the dictionary.
  381. : killName  n>count 1 fill ;
  382. : clobber  'c cold >body nfa
  383.     BEGIN  dup killName  pfa lfa @ dup 'c fWind >body nfa =
  384.     UNTIL drop   ;
  385.  
  386. \ This will clobber the entire dictionary. This could be fatal if your code
  387. \   does a search of the dictionary at runtime. For that reason, this code
  388. \   is not used here.
  389. \ : (clobber)  ( mycfa parm --)  drop >body nfa killName ;
  390. \ : clobber 'c (clobber) 0 trav ;
  391.  
  392. 1 Value icurs
  393.  
  394. : iBNDL 
  395.     'c bye 0 to: Aact    \ Alert action
  396.     new: applName
  397.     getnew: iDlg
  398.     getR
  399.     " NULW" 10 putText: iDlg
  400.     " fpInit" sFind IF 2drop " CLEANFLOAT" ELSE " CLEAN2" THEN
  401.     11 putText: iDlg
  402.     latest n>count 12 putText: iDlg    \ ******
  403.     0 $ ffff 5 setSelect: iDlg
  404.     modal: iDlg
  405.     IF    watchcurs
  406.         5 getText: iDlg    2dup put: applName    \ get new filename
  407.         str255 call createResFile            \ create new file by that name
  408.         5 getText: iDlg name: fFcb             \ want to set finder flags
  409.         getfileinfo: ffcb 0 Alert" getfileinfo error"
  410.         ffcb 40 + w@ $ 2100 or ffcb 40 + w!    \ set bndl bit and init bit
  411.         ffcb fcall setfileinfo 0 Alert" setfileinfo error"
  412.         lock: applName
  413.         word0 get: applName str255 unlock: applName
  414.         call openResFile i->l 0< not
  415.         IF putR                    \ store new resources
  416.             " Installing ^0 ^1" 23 putText: iDlg
  417.             'c AddModRes 0 trav        \ Convert modules on this disk into resources
  418.             " Dictionary" "  " iMsg
  419.             init: loadFile
  420. \            15 get: iDlg IF get: imageName name: fFcb delete: fFcb drop THEN
  421.             14 get: iDlg IF clobber THEN        \ fsecure nucleus
  422.             setMem saveAppl                        \ save application
  423.         ELSE close: iDlg 1 1 alert" couldn't open appl resource file" abort
  424.         THEN
  425.     THEN
  426.     release: applName
  427.     close: iDlg
  428.     'c IMOD mUnlock 'c abort 0 to: Aact icurs -> curs set: fwind become quit ;
  429.  
  430.  
  431. vScroll vs1
  432. vScroll vs2
  433.  
  434. Control saveBtn
  435. Control instBtn
  436. Control canBtn
  437. Control heapBtn
  438.  
  439. Control mxSt  radioID  init: mxSt
  440. Control miSt  radioID  init: miSt
  441. Control mxDi  radioID  init: mxDi
  442. Control miDi  radioID  init: miDi
  443.  
  444. \ Rectangles for formatting screen
  445. Rect stRect    \ stack headroom
  446. 20 20 170 40 put: stRect
  447. Rect hpRect    \ heap start size
  448. 20 45 170 65 put: hpRect
  449. Rect diRect    \ Dictionary headroom
  450. 20 70 170 90 put: diRect
  451.  
  452. rect wRect
  453. 100 40 400 170 put: wRect
  454.  
  455. \ get current limits for stack and dict based on minHeap
  456. : maxiStack  curStack curHeap minHeap - + ;
  457. : maxiDict   curDict  curHeap minHeap - + ;
  458. 9000 value minStack
  459.  128 value minDict
  460.  
  461. \ print number in rect
  462. : .Val  { n theRect -- }  tempRect =: theRect
  463.     4 4 inset: tempRect 100 putTopX: tempRect clear: tempRect
  464.     104 getboty: tempRect  gotoxy n 7 .r  ;
  465.  
  466. : .vs1  curStack stRect .val curHeap hpRect .val ;
  467. : .vs2  curDict  diRect .val curHeap hpRect .val ;
  468.  
  469. : drawIwind  draw: stRect draw: hpRect draw: diRect
  470.    2 tmode 0 tfont 12 tsize
  471.    24 36 gotoxy ." Stack:"
  472.    24 61 gotoxy ." Heap:"
  473.    24 86 gotoxy ." Dictionary:"  .vs1 .vs2  ;
  474.  
  475. \ Define the Install utility window
  476. ctlWind iWind
  477. 4 'cfas  null null drawIwind null actions: iWind
  478.  
  479. \ listen to mouse and drop keys
  480. : listener  BEGIN key drop AGAIN  ;
  481.  
  482. \ Create new window, controls
  483. : Install
  484.     wRect "  " dlgWind True False new: iWind
  485.     180 15 33 iWind new: vs1  180 65 33 iWind new: vs2
  486.     2000 32000 putRange: vs1  0 8000 putRange: vs2
  487.     4000 dup put: vs1  put: vs2
  488.     @stack -> curStack  room -> curDict
  489.     197 14 " ++" iWind new: mxSt
  490.     197 30 " --" iWind new: miSt
  491.     197 64 " ++" iWind new: mxDi
  492.     197 80 " --" iWind new: miDi
  493.     238 20 " Save" iWind new: saveBtn
  494.     236 45 " Install" iWind new: instBtn
  495.     236 70 " Cancel" iWind new: canBtn
  496.     150 105 " Max Heap" iWind new: heapBtn
  497.     update: iWind   curs -> icurs -curs
  498.     Become listener ;
  499.  
  500. : stDn  curStack 8 - minStack max -> curStack  .vs1  ;
  501. : stUp  curStack 8+  maxiStack min -> curStack  .vs1  ;
  502.  
  503. : diDn  curDict 32 -  minDict max -> curDict  .vs2  ;
  504. : diUp  curDict 32 +  maxiDict min -> curDict  .vs2  ;
  505.  
  506. 5 'cfas stUp stDn null null null actions: vs1
  507. 5 'cfas diUp diDn null null null actions: vs2
  508.  
  509. : config   curDict here + begin-dp @ - msize ! ( !heap) !stack  saveNuc ;
  510. : wInstall close: iWind buildmodWind  ;
  511. : cancel   close: iWind 'c IMOD mUnlock icurs -> curs set: fwind become quit ;
  512.  
  513.  
  514. : doMxSt  curStack 512 + maxiStack min -> curStack .vs1 ;
  515. : doMiSt  curStack 512 - minStack max -> curStack .vs1 ;
  516. : doMxDi  curDict 8192 + maxiDict min -> curDict .vs2 ;
  517. : doMiDi  curDict 8192 - minDict max -> curDict .vs2 ;
  518. : doMxHp  minStack -> curStack .vs1  minDict -> curDict .vs2 ;
  519. : buildInstall acceptSelect iBndl ;
  520. 'c BuildInstall actions: selectBut
  521.  
  522. 'c config   actions: saveBtn
  523. 'c wInstall actions: instBtn
  524. 'c cancel   actions: canBtn
  525. 'c doMxSt   actions: mxSt
  526. 'c doMiSt   actions: miSt
  527. 'c doMxDi   actions: mxDI
  528. 'c doMiDi   actions: miDi
  529. 'c doMxHp   actions: heapBtn
  530.  
  531. ;Module
  532.